package 笔试;

import java.util.Stack;

/**
 * @Date 2024/11/11 13:23
 * @description: 途家民宿
 * .
 * @Author LittleNight
 */
public class tujiaminsu {

    // 这个是没有空格的, 测试带空格的只过了 40%
    public static int calculate(String expression) {
        // write code here
        //利用栈
        Stack<Integer> stack = new Stack<>();
        int n = expression.length(), i = 0;
        char op = '+';
        char[] ch = expression.toCharArray();
        while (i < n) {
            // 1. 空格, 忽略
            if (ch[i] == ' ') i++;
            else if (ch[i] >= '0' && ch[i] <= '9') {
                // 2.数字, 提取数字
                int tmp = 0;
                while (i < n && ch[i] >= '0' && ch[i] <= '9') {
                    tmp = tmp * 10 + (ch[i] - '0');
                    i++;
                }
                // 添加数字入栈
                if (op == '+') stack.push(tmp);
                else if (op == '-') stack.push(-tmp);
                else if (op == '*') stack.push(stack.pop() * tmp);
                else stack.push(stack.pop() / tmp);
            } else {
                // 3. 遇到符号, 直接更新
                // 遇到括号怎么解决, 计算括号内的, 然后入栈
                op = ch[i];
                i++;
            }
        }

        // 提取结果
        int ret = 0;
        while(!stack.isEmpty()) {
            ret += stack.pop();
        }
        return ret;
    }
    // 实现一个计算器, 计算 "3 + 5 * 2 / ( 4 - 2 )"
    // 设计一个计算器，能够接收一个包含加法、减
    //法、乘法和除法的表达式字符串，并返回该表
    //达式的计算结果。
    //*要求*：
    //1.提示的表达式仅包含正整数和上述四种基本
    //运算符。
    //2.表达式中各个元素以空格分隔，例如"3+5
    //2-8/4"。
    //3.方法需要处理可能的括号，并按正确的运算
    //顺序计算结果。
    //4.考虑算术表达式的合法性，不会有非法表达
    //式输入。
    public static void main(String[] args) {
        String expression = "3 + 5 * 2 / ( 4 - 2 )";
        int result = calculate(expression);
        System.out.println(result);
    }


    //给出一组英文句子构成的数组，找出其中topN
    //词频的高频词，并输出词频信息及对应语句。
    //1.词频，单个词出现的次数，topN词频即词次数
    //最高的N个词频，如一组句子，词-词频为
    //(a=4,b=3,c=3,d=2),取top2词频的词，指取出
    //4、3对应的所有词[a,b,cl,取top3词频的词，指
    //取出4、3、2对应的所有词[a,b,c,d]
    //2.若单词后面跟着标点符号，需要去掉标点符
    //号再计数，如"this is a dog.",应记录“dog”词
    //频为1，而不是“dog”词频为1，可能的标点符
    //号列表为[，！？.]（英文半角逗号、叹号、问
    //号、句号)
    //3.词频统计，不包含给定的停用词列表，即停
    //用词列表为排除词列表
    //4.词通过空格进行定界
    //输出要求：输出字符串数组


    // 第一项输出指定topN个词频对应的词，词频
    //高的词在前，词频相同的情况下，对应词都输
    //出，按词字母顺序排序（忽略大小写）
    //使用英文圆括号和英文逗号作为词频分
    //组，顺序输出，中间空格分隔
    //(词1,3)（词2,2）（词3,2）（词4,1）
    //第二项开始，输出包含高频词的原始语句
}
